Python 模拟执行 JavaScript 教程

目录

  1. 简介
  2. 准备工作
  3. 案例分析与实现
  4. 常见问题与解决方案
  5. 总结

简介

在现代Web开发中,JavaScript被广泛用于前端逻辑实现,包括数据加密、动态内容加载等。当我们需要用Python爬取这类网站时,往往需要模拟执行JavaScript代码来获取关键数据。本教程将介绍如何使用Python模拟执行JavaScript,重点讲解PyExecJS库的使用方法和常见问题解决方案。

准备工作

安装必要工具

  1. 安装PyExecJS库:
pip install PyExecJS
  1. 安装JavaScript运行环境(推荐Node.js):
node -v
npm -v

验证环境配置

import execjs
print(execjs.get().name)  # 应输出类似"Node.js (V8)"

案例分析与实现

案例网站分析

以NBA球星网站(https://spa7.scrape.center/)为例,网站中每个球星卡片都有一个加密字符串,我们需要分析其生成逻辑。

加密逻辑分析

  1. 加密方法:getToken
  2. 输入:球员信息对象
  3. 加密过程:
    • 提取球员姓名、生日、身高、体重
    • 进行Base64编码
    • 使用DES加密
  4. 依赖库:crypto-js

实现步骤

  1. 准备JavaScript文件(crypto.js):
// 1. 初始化CryptoJS
var CryptoJS = (function() {
    // crypto-js.min.js的内容
    // ...省略具体实现...
    return e();
})();

// 2. 定义getToken方法
function getToken(item) {
    var key = "XwKsGlMcdPMEhR1B";
    var object = {
        name: item.name,
        birthday: item.birthday,
        height: item.height,
        weight: item.weight
    };
    var string = JSON.stringify(object);
    var encrypted = CryptoJS.DES.encrypt(
        CryptoJS.enc.Utf8.parse(string),
        CryptoJS.enc.Utf8.parse(key),
        {
            mode: CryptoJS.mode.ECB,
            padding: CryptoJS.pad.Pkcs7
        }
    );
    return encrypted.toString();
}
  1. Python调用代码:
import execjs
import json

# 读取JavaScript文件
with open('crypto.js', 'r', encoding='utf-8') as f:
    js_code = f.read()

# 准备球员数据
player = {
    "name": "LeBron James",
    "birthday": "1984-12-30",
    "height": "2.06m",
    "weight": "113.4kg"
}

# 创建执行环境
ctx = execjs.compile(js_code)

# 调用JavaScript函数
token = ctx.call('getToken', player)
print(f"加密结果: {token}")

常见问题与解决方案

1. CryptoJS未定义错误

问题原因:在Node.js环境中,crypto-js库默认不会将CryptoJS挂载到全局对象。

解决方案

// 手动初始化CryptoJS
var CryptoJS = (function() {
    // crypto-js.min.js的内容
    // ...省略具体实现...
    return e();
})();

2. 编码问题

问题表现:中文字符处理异常。

解决方案

  • 确保JavaScript文件使用UTF-8编码
  • Python读取时指定编码:
with open('crypto.js', 'r', encoding='utf-8') as f:
    js_code = f.read()

3. 性能优化

对于频繁调用的场景:

  1. 复用执行上下文
  2. 预编译JavaScript代码
  3. 考虑使用其他高性能方案(如PyV8)

总结

通过PyExecJS库,我们可以方便地在Python中执行JavaScript代码,解决爬虫开发中遇到的加密参数生成等问题。关键点包括:

  1. 正确初始化JavaScript执行环境
  2. 处理JavaScript库的导出方式差异
  3. 优化执行性能

完整示例代码:GitHub仓库

进阶学习

  • 更复杂的JavaScript逆向工程
  • WebAssembly解析
  • 浏览器自动化技术